#功能：遍历字典


##遍历所有的键值对
#字典可用于以各种方式存储信息，因此有多种遍历字典的方式：可遍历字典的所有键—值对、键或值

#example1
user_0 = {
	'username': 'efermi',
	'first': 'enrico',
	'last': 'fermi',
	}
	
print(user_0)
#利用本章前面介绍过的知识，可访问user_0的任何一项信息
#但如果要获悉该用户字典中的所有信息，该怎么办呢？可以使用一个for循环来遍历这个字典
for key, value in user_0.items():
	# print("\nKey:" + key)
	# print("value:" + value)
	print(f"\nKey: {key}")
	print(f"Value: {value}")
#编写用于遍历字典的for循环，可声明两个变量，用于存储键—值对中的键和值
#对于这两个变量，可使用任何名称。上面面的代码使用了简单的变量名key和value，这完全可行
#for语句的第二部分包含字典名和方法items(),它返回一个键—值对列表
#接下来，for循环依次将每个键—值对存储到指定的两个变量中
#在前面的示例代码中，我们使用这两个变量来打印每个键及其相关联的值
#第一条print语句中的"\n" 确保在输出每个键—值对前都插入一个空行：
#注意，即便遍历字典时，键—值对的返回顺序也与存储顺序不同
#Python不关心键—值对的存储顺序，而只跟踪键和值之间的关联关系。

favorite_languages = {
	'jen': "Python",
	'sarsh': "c",
	'edward': "ruby",
	'phil': "python"
}

for name, language in favorite_languages.items():
	print(f"{name.title()}'s favorite language is {language.title()}.")


# 遍历字典中的所有键
# 在不需要使用字典中的值时，方法keys() 很有用。
# 下面来遍历字典favorite_languages ，并将每个被调查者的名字都打印出来：

favorite_languages = {
	'jen': "Python",
	'sarsh': "c",
	'edward': "ruby",
	'phil': "python"
}

# 当然也可以写为：for name in favorite_languages:
for name in favorite_languages.keys():
	print(name.title())

# 显式地使用方法keys() 可让代码更容易理解，你可以选择这样做，但是也可以省略它。
# 在这种循环中，可使用当前键来访问与之相关联的值。下面来打印两条消息，指出两位朋友喜欢的语言。
# 像前面一样遍历字典中的名字，但在名字为指定朋友的名字时，打印一条消息，指出其喜欢的语言：

favorite_languages = {
	'jen': "Python",
	'sarsh': "c",
	'edward': "ruby",
	'phil': "python"
}

friends = ['phil', 'sarsh']
for name in favorite_languages.keys():
	print(f"Hi {name.title()}.")

	if name in friends:
		language = favorite_languages[name].title()
		print(f"\t{name.title()}, I see you love {language}")


# 还可使用方法keys() 确定某个人是否接受了调查。
# 下面的代码确定Erin是否接受了调查
favorite_languages = {
	'jen': "Python",
	'sarsh': "c",
	'edward': "ruby",
	'phil': "python"
}

if 'erin' not in favorite_languages.keys():
	print("Erin, please take our poll!")


# 从Python 3.7起，遍历字典时将按插入的顺序返回其中的元素。
# 不过在有些情况下，你可能要按与此不同的顺序遍历字典。
# 要以特定顺序返回元素，一种办法是在for 循环中对返回的键进行排序。
# 为此，可使用函数sorted() 来获得按特定顺序排列的键列表的副本
favorite_languages = {
	'jen': "Python",
	'sarsh': "c",
	'edward': "ruby",
	'phil': "python"
}

for name in sorted(favorite_languages.keys()):
	print(f"{name.title()}, thank you for taking the poll.")
# 这条for 语句类似于其他for 语句，不同之处是对方法dictionary.keys() 的结果调用了函数sorted() 。
# 这让Python列出字典中的所有键，并在遍历前对这个列表进行排序。输出表明，按顺序显示了所有被调查者的名字

# 遍历字典中的所有值
# 如果主要对字典包含的值感兴趣，可使用方法values() 来返回一个值列表，不包含任何键。
# 例如，假设我们想获得一个列表，其中只包含被调查者选择的各种语言，而不包含被调查者的名字，可以这样做
favorite_languages = {
	'jen': "Python",
	'sarsh': "c",
	'edward': "ruby",
	'phil': "python"
}

print("The following languages have been mentioned:")
for language in favorite_languages.values():
	print(language.title())
# 这条for 语句提取字典中的每个值，并将其依次赋给变量language 。
# 通过打印这些值，就获得了一个包含被调查者所选择语言的列表
# 这种做法提取字典中所有的值，而没有考虑是否重复。
# 涉及的值很少时，这也许不是问题，但如果被调查者很多，最终的列表可能包含大量重复项。
# 为剔除重复项，可使用集合（set）。集合中的每个元素都必须是独一无二的
favorite_languages = {
	'jen': "python",
	'sarsh': "c",
	'edward': "ruby",
	'phil': "python"
}
print("The following languages have been mentioned:")
for language in set(favorite_languages.values()):
	print(language.title())
# 通过对包含重复元素的列表调用set() ，可让Python找出列表中独一无二的元素，并使用这些元素来创建一个集合

# 注意 　可使用一对花括号直接创建集合，并在其中用逗号分隔元素：
languages = {'python', 'ruby', 'python', 'c'}
print(languages)
# 集合和字典很容易混淆，因为它们都是用一对花括号定义的。
# 当花括号内没有键值对时，定义的很可能是集合。不同于列表和字典，集合不会以特定的顺序存储元素

